package TestProject02.ui;

import TestProject02.domain.User;
import cn.hutool.core.io.FileUtil;

import javax.swing.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.io.IOException;
import java.util.ArrayList;

public class RegisterJFrame extends JFrame implements MouseListener {

    ArrayList<User> allUsers;

    //提升三个输入框的变量的作用范围，让这三个变量可以在本类中所有方法里面可以使用
    JTextField username = new JTextField();
    JTextField password = new JTextField();
    JTextField repassword = new JTextField();

    //提升两个按钮变量的作用范围，让这两个变量可以在本类中所有方法里面可以使用。
    JButton submit = new JButton();
    JButton reset = new JButton();


    public RegisterJFrame(ArrayList<User> allUsers) {
        this.allUsers = allUsers;
        initFrame();
        initView();
        setVisible(true);
    }

    //初始化界面
    private void initFrame() {
        //设置界面的宽高
        this.setSize(488, 500);
        //设置界面的标题
        this.setTitle("拼图 注册");
        //设置界面置顶
        this.setAlwaysOnTop(true);
        //设置界面居中
        this.setLocationRelativeTo(null);
        //设置关闭模式
        this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    }

    //初始化图片
    private void initView() {
        //添加用户名文字
        JLabel usernameText = new JLabel(new ImageIcon("D:\\code\\java-test1\\image\\register\\注册用户名.png"));
        usernameText.setBounds(116, 135, 51, 19);
        this.getContentPane().add(usernameText);

        //添加注册用户名输入框
        username.setBounds(195, 134, 200, 30);
        this.getContentPane().add(username);

        //添加密码文字
        JLabel passwordText = new JLabel(new ImageIcon("D:\\code\\java-test1\\image\\register\\注册密码.png"));
        passwordText.setBounds(130, 195, 32, 16);
        this.getContentPane().add(passwordText);

        //添加密码输入框
        password.setBounds(195, 195, 200, 30);
        this.getContentPane().add(password);

        //添加验证码提示
        JLabel codeTest = new JLabel(new ImageIcon("D:\\code\\java-test1\\image\\register\\再次输入密码.png"));
        codeTest.setBounds(133, 256, 50, 30);
        this.getContentPane().add(codeTest);

        //添加再次输入密码输入框
        repassword.setBounds(195, 256, 100, 30);
        this.getContentPane().add(repassword);


        //添加注册按钮
        submit.setBounds(123, 310, 128, 47);
        submit.setIcon(new ImageIcon("D:\\code\\java-test1\\image\\register\\注册按钮.png"));
        //去除按钮的默认边框
        submit.setBorderPainted(false);
        //去除按钮的默认背景
        submit.setContentAreaFilled(false);
        //给注册按钮添加鼠标事件
        submit.addMouseListener(this);
        this.getContentPane().add(submit);

        //添加重置按钮
        reset.setBounds(256, 310, 128, 47);
        reset.setIcon(new ImageIcon("D:\\code\\java-test1\\image\\register\\重置按钮.png"));
        //去除按钮的默认边框
        reset.setBorderPainted(false);
        //去除按钮的默认背景
        reset.setContentAreaFilled(false);
        //给重置按钮绑定鼠标事件
        reset.addMouseListener(this);
        this.getContentPane().add(reset);

        //添加背景图片
        JLabel background = new JLabel(new ImageIcon("D:\\code\\java-test1\\image\\register\\background.png"));
        background.setBounds(0, 0, 470, 390);
        this.getContentPane().add(background);
    }

    //定义方法设置弹框
    public void showJDialog(String content) {
        //创建一个弹框对象
        JDialog jDialog = new JDialog();
        //给弹框设置大小
        jDialog.setSize(200, 150);
        //让弹框置顶
        jDialog.setAlwaysOnTop(true);
        //让弹框居中
        jDialog.setLocationRelativeTo(null);
        //弹框不关闭永远无法操作下面的界面
        jDialog.setModal(true);

        //创建Jlabel对象管理文字并添加到弹框当中
        JLabel warning = new JLabel(content);
        warning.setBounds(0, 0, 200, 150);
        jDialog.getContentPane().add(warning);

        //让弹框展示出来
        jDialog.setVisible(true);
    }

    //点击
    @Override
    public void mouseClicked(MouseEvent e) {
        if (e.getSource() == submit) {
            //点击了注册按钮

            //1、用户名和密码不能为空
            if (username.getText().length() == 0 || password.getText().length() == 0 || repassword.getText().length() == 0) {
                showJDialog("用户名和密码不能为空");
                return;
            }
            //2.判断两次密码输入是否一致
            if (!password.getText().equals(repassword.getText())) {
                showJDialog("两次密码输入不一致");
                return;
            }
            //3、判断用户名和密码的格式是否正确
            if (!username.getText().matches("[a-zA-Z0-9]{4,16}")) {
                showJDialog("用户名不符合规则");
                return;
            }
            if (!password.getText().matches("\\S*(?=\\S{6,})(?=\\S*\\d)(?=\\S*[a-z])\\S*")) {
                showJDialog("密码不符合规则，至少包含1个小写字母,1个数宁，长度至少6位");
                return;
            }
            //4、判断用户名是否已经重复
            if (containsUsername(username.getText())) {
                showJDialog("用户名已经存在");
                return;
            }
            //5、添加用户
            allUsers.add(new User(username.getText(), password.getText()));
            //6、写入文件
            FileUtil.writeLines(allUsers, "D:\\工作\\工作\\src\\puzzlegame\\userinfo.txt", "UTF-8");
            //7、提示注册成功
            showJDialog("注册成功");
            //8、关闭注册界面，打开登录界面
            this.setVisible(false);
            try {
                new LoginJFrame();
            } catch (IOException ex) {
                ex.printStackTrace();
            }

        } else if (e.getSource() == reset) {
            //点击了重置按钮
            //清空三个输入框
            username.setText("");
            password.setText("");
            repassword.setText("");
        }
    }

    @Override
    public void mousePressed(MouseEvent e) {

    }

    @Override
    public void mouseReleased(MouseEvent e) {

    }

    @Override
    public void mouseEntered(MouseEvent e) {

    }

    @Override
    public void mouseExited(MouseEvent e) {

    }

    //定义方法判断用户名是否存在
    public boolean containsUsername(String username) {
        for (User u : allUsers) {
            if (u.getUsername().equals(username)) {
                return true;
            }
        }
        return false;
    }
}
